package negocio;

import java.awt.Rectangle;
import java.util.Random;

/*
 * Classe com o repositório dos elementos e lógica do jogo
 */
public class Jogo {
    private Jogador jogador;
    private Jogador inimigo;
    private int status; // 0-pausado, 1-andamento, 2-terminado
    private int largura, altura;
    private Random r = new Random();
    private int movInimigo = 0;

    public Jogo(int largura, int altura) {
        this.largura = largura;
        this.altura = altura;
        this.status = 0;
    }

    /*
     * Inicia uma nova partida com os personagens indicados
     */
    public void novaRodada() {
        jogador = new Jogador("imagens/if.png", this);
        jogador.setX(r.nextInt(largura - jogador.getLargura()));
        jogador.setY(r.nextInt(altura - jogador.getAltura()));

        inimigo = new Jogador("imagens/diploma.png", this);
        inimigo.setX(r.nextInt(largura - inimigo.getLargura()));
        inimigo.setY(r.nextInt(altura - inimigo.getAltura()));
        status = 1;
    }

    /*
     * É chamado várias vezes durante a execução do jogo para realizar cada
     * fração de movimento, detectar colizões e executar a lógica do jogo
     */
    public void realizaJogada() {
        if (jogador == null || status != 1) {
            return;
        }

        if (++movInimigo % 25 == 0) {
            movimentaInimigos();
        }

        jogador.move();
        verificaColisoes();
    }

    /*
     * Move o inimigo de forma aleatória 15 posições para a direita ou esquerda
     */
    public void movimentaInimigos() {
        inimigo.deslocaX(r.nextInt(30) - 15);
        inimigo.deslocaY(r.nextInt(30) - 15);
    }

    /*
     * Detecta colisões entre o jogador e inimigo e chama a lógica
     * correspondente
     */
    private void verificaColisoes() {
        Rectangle rJ1 = jogador.getLimites();
        Rectangle rJ2 = inimigo.getLimites();

        if (rJ1.intersects(rJ2)) {
            logicaDoJogo();
        }
    }

    /*
     * Na ocorrência de colisões: pontua o jogador, muda a posição do inimigo e
     * detecta o final do jogo
     */
    public void logicaDoJogo() {
        jogador.pontua(+1);

        inimigo.setX(r.nextInt(largura - inimigo.getLargura()));
        inimigo.setY(r.nextInt(altura - inimigo.getAltura()));

        if (jogador.getPontuacao() >= 10) {
            status = 2;
        }
    }

    public Jogador getJogador() {
        return jogador;
    }

    public Jogador getInimigo() {
        return inimigo;
    }

    public int getStatus() {
        return status;
    }

    public int getAltura() {
        return altura;
    }

    public int getLargura() {
        return largura;
    }
}
